package com.single;

/**
 * @author cyf
 * @description 单例模式
 * @create 2018-09-20 17:54
 **/
public class SingleTon3 {


    /**
     * 懒汉模式 ：线程安全，双重加锁;
     *
     * volatile 关键字是因为多线程保证 JVM 指令运行。
     */
    private volatile static SingleTon3 instance;

    private SingleTon3() {
    }

    /**
     * 双重加锁原因：当对象未被实例化的时候加锁，提高效率。
     * 2个 if 语句是因为，多线程情况下，可能2个线程同时进入，造成对象被实例化2次。
     */

    public static SingleTon3 getInstance() {
        if (null == instance) {
            synchronized (SingleTon3.class) {
                if (null == instance) {
                    instance = new SingleTon3();
                    /**
                     *  new SingleTon3()
                     *
                     *  对象创建的过程分三步：
                     *  1. 为 instance 分配存储空间
                     *  2. 初始化 instance
                     *  3. 将 instance 指向分配的内存地址
                     */
                }
            }
        }
        return instance;
    }

    public static void main(String[] args) {
        SingleTon3 instance = SingleTon3.getInstance();
        SingleTon3 instance1 = SingleTon3.getInstance();
        System.out.println(instance == instance1);
    }

}
